#pragma once

#include <cstddef>

/**
 * @brief 第二版本：新增 nullptr 构造。
 *
 * 为了让 `UniquePtr<int> ptr(nullptr);` 与默认构造保持等价，
 * 增加一个接受 `std::nullptr_t` 的构造函数并复用默认构造逻辑。
 */
template <typename T, typename Deleter = void(*)(T*)>
class UniquePtr {
public:
    using pointer      = T*;
    using element_type = T;
    using deleter_type = Deleter;

    constexpr UniquePtr() noexcept
        : ptr_(nullptr)
        , deleter_(nullptr) {}

    /**
     * @brief nullptr 构造函数。
     *
     * 使用委托构造（调用默认构造）来避免重复代码。
     */
    constexpr UniquePtr(std::nullptr_t) noexcept
        : UniquePtr() {}

    pointer get() const noexcept {
        return ptr_;
    }

    explicit operator bool() const noexcept {
        return ptr_ != nullptr;
    }

private:
    pointer      ptr_;
    deleter_type deleter_;
};